//
//  DeviceInfoHelper.cpp
//  UpUpGameCommonInterface
//
//  Created by qiming on 15-4-17.
//  Copyright (c) 2015年 UpUpGameCommonInterface. All rights reserved.
//

#import "DeviceInfoHelper.h"
#import <UIKit/UIKit.h>
#import "SFHFKeychainUtils.h"
#import <sys/sysctl.h>

@interface DeviceInfoHelper()

- (NSString *) QueryDeviceID;
- (void) QueryVendorID;
- (NSString*) getKeychainIdentifier;

- (NSString *) platform;
- (NSString *) platformString;

- (NSString *) getSystemVersion;
- (NSString *) getPhoneModel;
- (NSString *) getDeviceId;
- (NSString *) getDeviceName;
- (NSString *) getDevicePool;

@end

@implementation DeviceInfoHelper

static DeviceInfoHelper *sharedHelper = nil;

+(DeviceInfoHelper*) currentDeviceInfo
{
    if (!sharedHelper)
    {
        sharedHelper = [[DeviceInfoHelper alloc] init];
    }
    return sharedHelper;
}

- (NSString*) getKeychainIdentifier
{
    NSString *str =nil;
    NSString *uuidStr = [SFHFKeychainUtils getPasswordForUsername:@"joke_uuid" andServiceName:@"com.livexy.joke" error:nil];
    if(uuidStr == nil)
    {
        NSString *myUUIDStr = [self QueryDeviceID];
        [SFHFKeychainUtils storeUsername:@"joke_uuid" andPassword:myUUIDStr forServiceName:@"com.livexy.joke" updateExisting:1 error:nil];
        str = myUUIDStr;
    }
    else
    {
        str = uuidStr;
    }

    return str;
}

- (NSString *) QueryDeviceID
{
    if(self.strVendorID == nil)
    {
        if(self.strVendorID == nil)
        {
            [self QueryVendorID];
            self.strVendorID = self.strVendorID;
        }

    }
    return self.strVendorID;
}

- (void) QueryVendorID
{
    if(self.strVendorID == nil && [UIDevice instancesRespondToSelector:@selector(identifierForVendor)])
        self.strVendorID = (NSString*)[[[UIDevice currentDevice] performSelector:@selector(identifierForVendor)] UUIDString];
}

- (NSString *) platform
{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *machine = (char*)malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
    free(machine);
    return platform;
}

- (NSString *) platformString
{
    NSString *platform = [self platform];

    if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G (A1203)";
    if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G (A1241/A1324)";
    if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS (A1303/A1325)";
    if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4 (A1332)";
    if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4 (A1332)";
    if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4 (A1349)";
    if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S (A1387/A1431)";
    if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5 (A1428)";
    if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (A1429/A1442)";
    if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (A1456/A1532)";
    if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (A1507/A1516/A1526/A1529)";
    if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (A1453/A1533)";
    if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (A1457/A1518/A1528/A1530)";
    if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus (A1522/A1524)";
    if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6 (A1549/A1586)";

    if ([platform isEqualToString:@"iPod1,1"])   return @"iPod Touch 1G (A1213)";
    if ([platform isEqualToString:@"iPod2,1"])   return @"iPod Touch 2G (A1288)";
    if ([platform isEqualToString:@"iPod3,1"])   return @"iPod Touch 3G (A1318)";
    if ([platform isEqualToString:@"iPod4,1"])   return @"iPod Touch 4G (A1367)";
    if ([platform isEqualToString:@"iPod5,1"])   return @"iPod Touch 5G (A1421/A1509)";

    if ([platform isEqualToString:@"iPad1,1"])   return @"iPad 1G (A1219/A1337)";

    if ([platform isEqualToString:@"iPad2,1"])   return @"iPad 2 (A1395)";
    if ([platform isEqualToString:@"iPad2,2"])   return @"iPad 2 (A1396)";
    if ([platform isEqualToString:@"iPad2,3"])   return @"iPad 2 (A1397)";
    if ([platform isEqualToString:@"iPad2,4"])   return @"iPad 2 (A1395+New Chip)";
    if ([platform isEqualToString:@"iPad2,5"])   return @"iPad Mini 1G (A1432)";
    if ([platform isEqualToString:@"iPad2,6"])   return @"iPad Mini 1G (A1454)";
    if ([platform isEqualToString:@"iPad2,7"])   return @"iPad Mini 1G (A1455)";

    if ([platform isEqualToString:@"iPad3,1"])   return @"iPad 3 (A1416)";
    if ([platform isEqualToString:@"iPad3,2"])   return @"iPad 3 (A1403)";
    if ([platform isEqualToString:@"iPad3,3"])   return @"iPad 3 (A1430)";
    if ([platform isEqualToString:@"iPad3,4"])   return @"iPad 4 (A1458)";
    if ([platform isEqualToString:@"iPad3,5"])   return @"iPad 4 (A1459)";
    if ([platform isEqualToString:@"iPad3,6"])   return @"iPad 4 (A1460)";

    if ([platform isEqualToString:@"iPad4,1"])   return @"iPad Air (A1474)";
    if ([platform isEqualToString:@"iPad4,2"])   return @"iPad Air (A1475)";
    if ([platform isEqualToString:@"iPad4,3"])   return @"iPad Air (A1476)";
    if ([platform isEqualToString:@"iPad4,4"])   return @"iPad Mini 2G (A1489)";
    if ([platform isEqualToString:@"iPad4,5"])   return @"iPad Mini 2G (A1490)";
    if ([platform isEqualToString:@"iPad4,6"])   return @"iPad Mini 2G (A1491)";

    if ([platform isEqualToString:@"i386"])      return @"iPhone Simulator";
    if ([platform isEqualToString:@"x86_64"])    return @"iPhone Simulator";

    return platform;
}


- (NSString *) getSystemVersion
{
    return [[UIDevice currentDevice] systemVersion];
}

- (NSString *) getPhoneModel
{
    return [self platformString];
}

- (NSString *) getDeviceId
{
    return [self getKeychainIdentifier];
}

- (NSString *) getDeviceName
{
    return [[UIDevice currentDevice] name];
}

- (NSString *) getDevicePool
{
    [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
    CGFloat batteryLevel = [[UIDevice currentDevice] batteryLevel]*100;
    return [NSString stringWithFormat:@"%g",batteryLevel];
}

- (NSString*) geteDeviceInfo:(int) eType
{
    switch (eType)
    {
        case eDeviceInfo_SystemVersion:
        {
            return [self getSystemVersion];
        }
            break;

        case eDeviceInfo_PhoneModel:
        {
            return [self getPhoneModel];
        }
            break;

        case eDeviceInfo_DeviceId:
        {
            return [self getDeviceId];
        }
            break;

        case eDeviceInfo_DeviceName:
        {
            return [self getDeviceName];
        }
            break;

        case eDeviceInfo_DevicePool:
        {
            return [self getDevicePool];
        }
            break;

        default:
            break;
    }
    return nil;
}


@end